package com.school.sports.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.school.sports.dto.UserDTO;
import com.school.sports.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

/**
 * 用户Mapper接口
 * 提供用户相关的数据库操作方法，包含优化的分页查询
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据用户名查询用户（包含角色信息）
     */
    @Select("SELECT u.*, r.name as role_name FROM user u " +
            "LEFT JOIN role r ON u.role_id = r.id " +
            "WHERE u.username = #{username} AND u.is_active = 1")
    User findByUsername(String username);

    /**
     * 根据用户ID查询用户（包含角色信息）
     */
    @Select("SELECT u.*, r.name as role_name FROM user u " +
            "LEFT JOIN role r ON u.role_id = r.id " +
            "WHERE u.id = #{userId} AND u.is_active = 1")
    User findByIdWithRole(Long userId);

    /**
     * 检查用户名是否存在
     */
    @Select("SELECT COUNT(1) FROM user WHERE username = #{username} AND is_active = 1")
    int countByUsername(String username);

    /**
     * 分页查询用户信息（包含角色信息）
     * 使用JOIN查询避免N+1问题
     *
     * @param page 分页参数
     * @param realName 真实姓名（可选）
     * @param roleId 角色ID（可选）
     * @param isActive 是否激活（可选）
     * @param college 学院（可选）
     * @return 分页结果
     */
    IPage<UserDTO> selectUserPageWithRole(
            Page<UserDTO> page,
            @Param("realName") String realName,
            @Param("roleId") Integer roleId,
            @Param("isActive") Boolean isActive,
            @Param("college") String college
    );

    /**
     * 根据真实姓名模糊查询用户（包含角色信息）
     *
     * @param realName 真实姓名
     * @return 用户列表
     */
    @Select("SELECT u.id, u.username, u.real_name, u.gender, u.class_name, u.college, " +
            "u.phone, u.email, u.role_id, u.is_active, u.created_at, u.updated_at, " +
            "r.name as role_name, r.description as role_description " +
            "FROM user u " +
            "LEFT JOIN role r ON u.role_id = r.id " +
            "WHERE u.real_name LIKE CONCAT('%', #{realName}, '%') AND u.is_active = 1 " +
            "ORDER BY u.real_name")
    IPage<UserDTO> selectUsersByRealName(Page<UserDTO> page, @Param("realName") String realName);

    /**
     * 根据用户ID查询用户详细信息（包含角色信息）
     *
     * @param userId 用户ID
     * @return 用户详细信息
     */
    UserDTO selectUserByIdWithRole(@Param("userId") Long userId);

    /**
     * 根据用户名和密码查询用户信息（已弃用，使用Spring Security）
     * @deprecated 使用findByUsername和Spring Security进行密码验证
     */
    @Deprecated
    @Select("SELECT id, username, real_name FROM user WHERE username = #{username} AND password_hash = #{passwordHash} AND is_active = 1")
    User selectByUsernameAndPassword(User user);
}
